
#ifndef MBCOMMON_H
#define MBCOMMON_H

#include <QString>
#include <QVector>

// 寄存器地址定义
#define REG_ID          0   // 设备ID (1个寄存器)
#define REG_NAME        1   // 设备名称 (10个寄存器)
#define REG_VALUE       11  // 设备值 (2个寄存器，浮点数)
#define REG_STATUS      13  // 设备状态 (1个寄存器)
#define REG_TIMESTAMP   14  // 时间戳 (2个寄存器)
#define REG_TEMPERATURE 16  // 温度 (2个寄存器，浮点数)
#define REG_HUMIDITY    18  // 湿度 (2个寄存器，浮点数)
#define REG_PRESSURE    20  // 压力 (1个寄存器)
#define REG_ALARM       21  // 报警状态 (1个寄存器)
#define REG_DESC        22  // 描述信息 (15个寄存器)

// 总寄存器数量
#define TOTAL_REGS      37

// 设备数据结构
struct DeviceData {
    int id;
    QString name;
    float value;
    bool status;
    qint32 timestamp;
    float temperature;
    float humidity;
    int pressure;
    int alarmStatus;
    QString description;
};

// 数据转换函数
inline void floatToRegisters(float value, quint16& reg1, quint16& reg2)
{
    union {
        float f;
        quint32 i;
    } u;
    u.f = value;
    reg1 = u.i & 0xFFFF;         // 低16位
    reg2 = (u.i >> 16) & 0xFFFF; // 高16位
}

inline float registersToFloat(quint16 reg1, quint16 reg2)
{
    union {
        float f;
        quint32 i;
    } u;
    u.i = reg1 | (quint32(reg2) << 16);
    return u.f;
}

inline void int32ToRegisters(qint32 value, quint16& reg1, quint16& reg2)
{
    reg1 = value & 0xFFFF;         // 低16位
    reg2 = (value >> 16) & 0xFFFF; // 高16位
}

inline qint32 registersToInt32(quint16 reg1, quint16 reg2)
{
    return reg1 | (qint32(reg2) << 16);
}

inline void stringToRegisters(const QString& str, quint16* regs, int regCount)
{
    QByteArray utf8 = str.toUtf8();
    int byteCount = regCount * 2;
    for (int i = 0; i < regCount; ++i) {
        quint16 value = 0;
        if (i * 2 < utf8.size()) value |= (quint8)utf8[i * 2];
        if (i * 2 + 1 < utf8.size()) value |= (quint16)(quint8)utf8[i * 2 + 1] << 8;
        regs[i] = value;
    }
}

inline QString registersToString(const quint16* regs, int regCount)
{
    QByteArray utf8;
    utf8.reserve(regCount * 2);
    for (int i = 0; i < regCount; ++i) {
        utf8.append(regs[i] & 0xFF);
        utf8.append((regs[i] >> 8) & 0xFF);
    }
    return QString::fromUtf8(utf8.constData(), utf8.size()).trimmed();
}

#endif // MBCOMMON_H
